"""
通用工具函数模块
"""

__all__ = ['generate_orderid']

import hashlib
import random
from datetime import datetime
from typing import Dict, Any

def generate_orderid(prefix: str = "01") -> str:
    """
    生成订单号
    
    Args:
        prefix: 订单号前缀（默认01）
    
    Returns:
        订单号（前缀 + 日期时间 + 3位随机数）
    """
    now = datetime.now()
    date_str = now.strftime("%Y%m%d%H%M%S")
    random_str = str(random.randint(100, 999))  # 生成3位随机数
    return f"{prefix}{date_str}{random_str}"

def generate_md5(data: str) -> str:
    """
    生成大写的 MD5 签名
    
    Args:
        data: 需要签名的字符串
    
    Returns:
        大写的 MD5 签名
    """
    return hashlib.md5(data.encode('utf-8')).hexdigest().upper()

def get_current_datetime() -> tuple[str, str]:
    """
    获取当前日期和时间
    
    Returns:
        (日期, 时间) 元组，日期格式为 YYYYMMDD，时间格式为 HHMMSS
    """
    now = datetime.now()
    return now.strftime("%Y%m%d"), now.strftime("%H%M%S")

def format_amount(amount: float) -> str:
    """
    格式化金额为12位字符串（单位：分）
    
    Args:
        amount: 金额（元）
    
    Returns:
        12位字符串，前补0
    """
    # 转换为分
    amount_fen = int(amount * 100)
    return str(amount_fen).zfill(12)

def format_error_msg(resp_code: str, error_dict: Dict[str, str]) -> str:
    """
    根据响应码生成错误信息
    
    Args:
        resp_code: 响应码
        error_dict: 错误码字典
    
    Returns:
        错误信息
    """
    if resp_code == "0":
        return "交易成功"
    return error_dict.get(resp_code, f"交易失败(响应码:{resp_code})")

# 错误码字典
ERROR_CODES = {
    "0": "交易成功",
    "1001": "无效的商户号",
    "1002": "无效的终端号",
    "1003": "无效的交易金额",
    "1004": "无效的卡号",
    "1005": "无效的订单号",
    "1006": "无效的交易日期",
    "1007": "无效的交易时间",
    "1008": "无效的货币代码",
    "1009": "无效的外部订单号",
    "1010": "无效的外部商户号",
    "1011": "无效的外部商户名",
    "1012": "卡号不存在",
    "1013": "卡片已过期",
    "1014": "卡片已挂失",
    "1015": "卡片已冻结",
    "1016": "余额不足",
    "1017": "超出单笔限额",
    "1018": "超出日累计限额",
    "1019": "超出月累计限额",
    "1020": "MD5签名错误",
    "9999": "系统错误"
} 